/*
 * Copyright (C) 2013-2014 Bilibili
 * Copyright (C) 2013-2014 Zhang Rui <bbcallen@gmail.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package tv.danmaku.ijk.media.player;

import android.annotation.TargetApi;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.view.Surface;
import android.view.SurfaceHolder;

import java.io.FileDescriptor;
import java.io.IOException;
import java.util.Map;

import tv.danmaku.ijk.media.player.misc.IMediaDataSource;
import tv.danmaku.ijk.media.player.misc.ITrackInfo;

public interface IMediaPlayer {
  /*
   * Do not change these values without updating their counterparts in native
   */ int MEDIA_INFO_UNKNOWN = 1;
  int MEDIA_INFO_STARTED_AS_NEXT = 2;
  int MEDIA_INFO_VIDEO_RENDERING_START = 3;
  int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;
  int MEDIA_INFO_BUFFERING_START = 701;
  int MEDIA_INFO_BUFFERING_END = 702;
  int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
  int MEDIA_INFO_BAD_INTERLEAVING = 800;
  int MEDIA_INFO_NOT_SEEKABLE = 801;
  int MEDIA_INFO_METADATA_UPDATE = 802;
  int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
  int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;
  int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;

  int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;
  int MEDIA_INFO_AUDIO_RENDERING_START = 10002;
  int MEDIA_INFO_AUDIO_DECODED_START = 10003;
  int MEDIA_INFO_VIDEO_DECODED_START = 10004;
  int MEDIA_INFO_OPEN_INPUT = 10005;
  int MEDIA_INFO_FIND_STREAM_INFO = 10006;
  int MEDIA_INFO_COMPONENT_OPEN = 10007;
  int MEDIA_INFO_MEDIA_ACCURATE_SEEK_COMPLETE = 10100;

  int MEDIA_ERROR_UNKNOWN = 1;
  int MEDIA_ERROR_SERVER_DIED = 100;
  int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;
  int MEDIA_ERROR_IO = -1004;
  int MEDIA_ERROR_MALFORMED = -1007;
  int MEDIA_ERROR_UNSUPPORTED = -1010;
  int MEDIA_ERROR_TIMED_OUT = -110;

  void setDisplay(SurfaceHolder sh);

  void setDataSource(Context context, Uri uri)
      throws IOException, IllegalArgumentException, SecurityException, IllegalStateException;

  @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) void setDataSource(Context context, Uri uri,
      Map<String, String> headers)
      throws IOException, IllegalArgumentException, SecurityException, IllegalStateException;

  void setDataSource(FileDescriptor fd)
      throws IOException, IllegalArgumentException, IllegalStateException;

  void setDataSource(String path)
      throws IOException, IllegalArgumentException, SecurityException, IllegalStateException;

  String getDataSource();

  void prepareAsync() throws IllegalStateException;

  void start() throws IllegalStateException;

  void stop() throws IllegalStateException;

  void pause() throws IllegalStateException;

  void setScreenOnWhilePlaying(boolean screenOn);

  int getVideoWidth();

  int getVideoHeight();

  boolean isPlaying();

  void seekTo(long msec) throws IllegalStateException;

  long getCurrentPosition();

  long getDuration();

  void release();

  void reset();

  void setVolume(float leftVolume, float rightVolume);

  int getAudioSessionId();

  MediaInfo getMediaInfo();

  @SuppressWarnings("EmptyMethod") @Deprecated void setLogEnabled(boolean enable);

  @Deprecated boolean isPlayable();

  void setOnPreparedListener(OnPreparedListener listener);

  void setOnCompletionListener(OnCompletionListener listener);

  void setOnBufferingUpdateListener(OnBufferingUpdateListener listener);

  void setOnSeekCompleteListener(OnSeekCompleteListener listener);

  void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);

  void setOnErrorListener(OnErrorListener listener);

  void setOnInfoListener(OnInfoListener listener);

  void setOnTimedTextListener(OnTimedTextListener listener);

  /*--------------------
   * Listeners
   */
  interface OnPreparedListener {
    void onPrepared(IMediaPlayer mp);
  }

  interface OnCompletionListener {
    void onCompletion(IMediaPlayer mp);
  }

  interface OnBufferingUpdateListener {
    void onBufferingUpdate(IMediaPlayer mp, int percent);
  }

  interface OnSeekCompleteListener {
    void onSeekComplete(IMediaPlayer mp);
  }

  interface OnVideoSizeChangedListener {
    void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sar_num, int sar_den);
  }

  interface OnErrorListener {
    boolean onError(IMediaPlayer mp, int what, int extra);
  }

  interface OnInfoListener {
    boolean onInfo(IMediaPlayer mp, int what, int extra);
  }

  interface OnTimedTextListener {
    void onTimedText(IMediaPlayer mp, IjkTimedText text);
  }

  /*--------------------
   * Optional
   */
  void setAudioStreamType(int streamtype);

  @Deprecated void setKeepInBackground(boolean keepInBackground);

  int getVideoSarNum();

  int getVideoSarDen();

  @Deprecated void setWakeMode(Context context, int mode);

  void setLooping(boolean looping);

  boolean isLooping();

  /*--------------------
   * AndroidMediaPlayer: JELLY_BEAN
   */
  ITrackInfo[] getTrackInfo();

  /*--------------------
   * AndroidMediaPlayer: ICE_CREAM_SANDWICH:
   */
  void setSurface(Surface surface);

  /*--------------------
   * AndroidMediaPlayer: M:
   */
  void setDataSource(IMediaDataSource mediaDataSource);

  void setSpeed(float speed);

  float getSpeed();

  void setOption(int category, String name, long value);

  void setOption(int category, String name, String value);
}
